package siestageek;

import java.util.ArrayList;
import java.util.List;

public class J04_Collection {

	// 콜렉션 collection
	// 객체지향 기반 프로그램 작성시
	// 종종 같은 종류의 객체의 묶음group이나
	// 다른 종류의 객체묶음을 함께 쓰는때가 있음
	
	// 앞서 배운 배열은 같은 종류의 객체 묶음이지만
	// 유연성이 부족하고, 크기 조정도 안되고
	// 다른 종류의 객체도 가질 수 없음
	
	// 다행히 자바에는 이러한 종류의 객체를 쉽게
	// 다룰 수 있는 인터페이스와 클래스를 제공
	// 그것은 바로 Collection 프레임워크임
	
	// collection은 다른 종류로 구성객체들의 묶음을 의미
	// 또 다른 말로 용기container 라고도 하는데,
	// 각 요소를 저장, 검색, 조작하는 메서드를 제공
	
	// Collection <- Set, List, Queue
	// List <- ArrayList, Vector
	// Map <- AbstractMap, SortedMap
	// AbstractMap <- HashMap
	// Iterator, Comparator
	
	// 이들 대부분은 java.util 패키지에 포함됨
	
	// List - 동적 배열
	// Collection의 가장 인기있는 하위 인터페이스임
	// ArrayList는 List의 가장 자주사용하는 구현클래스
	// List는 자료를 순서대로 저장하는 특성을 가짐
	// FIFO : first in first out 선입선출
	// 또한, 데이터를 중복으로 저장가능
	// 단, Set은 중복 허용불가!
	// add 메서드를 통해 데이터를 List의 맨끝에 추가
	
	// 지네릭 generic
	// collection 을 배울때 generic 을 빼놓으면
	// 불완전하게 collection을 배우는 것임
	
	// collection 을 사용할 때 발생할 수 있는
	// 컴파일 시간때 엄격한 자료형을 검사를 지원
	// 또한, collection 을 다룰때 대부분의
	// downcasting을 제거하고 사용할 수 있음
	// 또한, C++에서 제공하는 클래스 템플릿을
	// 작성할 수 있게 해 줌 (고급)
	
	// 지네릭에서는 
	// 매개변수 자료형parameterized type을 이용해서
	// collection 요소의 자료형을 지정함
	// 메서드의 매개변수는 ()안에 사용하는 것처럼
	// collection에서는 <>안에 매개변수자료형을 사용 
	// List<String> result = null;
	
	public static void main(String[] args) {
		List a = new ArrayList();
		a.add(123456);
		a.add('수');
		a.add(123.456);
		a.add("김태희");
		a.add( new J03_MemberVO() );
		System.out.println( a );
		
		// ArrayList에 저장된 객체를 하나씩 꺼내 출력
		System.out.println( a.get( 0 ) );
		System.out.println( a.get( 1 ) );
		System.out.println( a.get( 2 ) );
		System.out.println( a.get( 3 ) );
		System.out.println( a.get( 4 ) );
		
		// ArrayList에 저장된 객체를 하나씩 꺼내
		// 변수에 따로 저장
		// 이유 : ArrayList에 객체를 저장할때는
		// 대상이 무엇이든 간에 무조건 Object형으로
		// 저장됨. 따라서, ArrayList에 저장된 객체를
		// 꺼낼때는 객체의 자료형에 맞춰 
		// downcasting이 필요 ( JDK 5 이전 ) 
		int num1 = (int) a.get( 0 );
		char chr = (char) a.get(1);
		float floatnum = (float) a.get( 2 );
		String str = (String) a.get( 3 );
		
		// 하지만, 이렇게 해도 일단 컴파일 오류는 X
		// 실행하면 비로소 오류가 뜸
		// 이런 종류의 오류는 찾기 힘듦
		char num2 = (char) a.get( 0 );			// int
		Integer intg = (Integer) a.get( 3 );	// String
		
		// 지네릭을 사용했을 경우
		List<String> abc = new ArrayList<String>();
		//List<String> abc = new ArrayList<>();	// JDK1.7
		// abc라는 콜렉션(동적배열)에는
		// String 형식의 값만 추가할 수 있다는 의미

		// abc.add(123);		// 자료형 검사후 오류 표시
		// abc.add('a');
		abc.add("김태희");	// 정상처리
	
		String xyz = abc.get( 0 );	// 형변환은 필요x
		
		List<J03_MemberVO> results =
				new ArrayList<J03_MemberVO>();
	}

}



